package online.hxstar.learn.util;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalUnit;
import java.util.Random;

/**
 * 时间工具类
 *
 * @author huxing
 */
public class DateUtils {
    /**
     * 返回时间时间字符串
     *
     * @return 时间
     */
    public static String nowTimeToStr() {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");
        return LocalDateTime.now(ZoneOffset.of("+8")).format(formatter);
    }

    /**
     * 生成流水号
     *
     * @return 流水
     */
    public static String nowTimeToSerialNO() {
        Random ran = new Random();
        return nowTimeToStr() + (ran.nextInt(89999) + 10000);
    }

    /**
     * 当前日期时间戳
     *
     * @return 时间戳
     */
    public static long nowToTimeStamp() {
        ZoneId zone = ZoneId.systemDefault();
        return LocalDateTime.now().atZone(zone).toInstant().toEpochMilli();
    }

    public static long timeToTimeStamp(LocalDateTime localDateTime) {
        ZoneId zone = ZoneId.systemDefault();
        Instant instant = localDateTime.atZone(zone).toInstant();
        return instant.toEpochMilli();
    }

    /**
     * 当前日期增加时间
     *
     * @param number 数量
     * @param field  类型
     * @return 增加后的时间
     */
    public static LocalDateTime nowPlus(long number, TemporalUnit field) {
        LocalDateTime localDateTime = LocalDateTime.now();
        return localDateTime.plus(number, field);
    }


    /**
     * String 转 时间
     *
     * @param time   时间
     * @param format 格式
     * @return 时间
     */
    public static LocalDateTime parseStringToDateTime(String time, String format) {
        DateTimeFormatter df = DateTimeFormatter.ofPattern(format);
        return LocalDateTime.parse(time, df);
    }

    /**
     * 字符串 转日期
     *
     * @param date 日期字符串
     * @return 日期
     */
    public static LocalDate strToDate(String date) {
        return LocalDate.parse(date);
    }

    /**
     * 日期增加
     *
     * @param date   日期
     * @param number 增加的数量
     * @param field  增加类型
     * @return 返回结果
     */
    public static LocalDate datePlus(LocalDate date, long number, TemporalUnit field) {
        return date.plus(number, field);
    }

    /**
     * 日期减少
     *
     * @param date   日期
     * @param number 减少的数量
     * @param field  减少类型
     * @return 返回结果
     */
    public static LocalDate dateMinus(LocalDate date, long number, TemporalUnit field) {
        return date.minus(number, field);
    }

    /**
     * 时间减少
     *
     * @param date   时间
     * @param number 减少的数量
     * @param field  减少类型
     * @return 返回结果
     */
    public static LocalDateTime dateTimeMinus(LocalDateTime date, long number, TemporalUnit field) {
        return date.minus(number, field);
    }

    /**
     * 第一个在第二个后面
     *
     * @param one 第一个日期
     * @param two 第二个日期
     * @return 比较结果
     */
    public static boolean oneAfterTwo(LocalDateTime one, LocalDateTime two) {
        return one.isAfter(two);
    }

    /**
     * 第一个在第二个后面
     *
     * @param one 第一个日期
     * @param two 第二个日期
     * @return 比较结果
     */
    public static boolean oneAfterTwo(LocalDate one, LocalDate two) {
        return one.isAfter(two);
    }

    /**
     * 第一个在第二个前面
     *
     * @param one 第一个日期
     * @param two 第二个日期
     * @return 比较结果
     */
    public static boolean oneBefore(LocalDateTime one, LocalDateTime two) {
        return one.isBefore(two);
    }

    /**
     * 第一个在第二个前面
     *
     * @param one 第一个日期
     * @param two 第二个日期
     * @return 比较结果
     */
    public static boolean oneBefore(LocalDate one, LocalDate two) {
        return one.isBefore(two);
    }

    /**
     * 日期转字符串
     *
     * @param localDateTime 时间
     * @return 转化的时间
     */
    public static String timeToStr(LocalDateTime localDateTime) {
        return localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    }
}
